package com.application.model;

import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RetrievePais_OtraOpcion extends RetrivierWeb {

	
//	public function convertLocalidades($localidades) {
//        $result = array();
//        $this->subBarriosItem = null;
//        $last = "";
//        foreach ($localidades as $value) {
//            $localidadId = $value->getId();
//            $localidadName = $value->getName();
//            $isBarrio = $value->getIs_Barrio();
//            $this->logMessage(" Localidad  id $localidadId name $localidadName is barrio $isBarrio last $last", "info");
//            if (!$value->getIs_Barrio() && strcmp($localidadId, $last) != 0) {
//                $this->logMessage("Localidad ");
//                $this->subBarriosItem = array();
//                $localidad = array("Nombre" => $value->getName(), "Id" => $value->getId(), "SubBarrios" => $this->subBarriosItem);
//                array_push($result, $localidad);
//                $last = $localidadId;
//            }else{
//            $this->logMessage("barrio ");
////            $item = array("Nombre" => $value->getName(), "Id" => $value->getId(),"is_barrio"=>$value->getIs_Barrio());
//            
//            
//            //array_key_exists($key, $searcharray)
////            "SubBarrios"=>
//            $item = array("Nombre" => $value->getName(), "Id" => $value->getId());
//            array_push($this->subBarriosItem, $item);
//            }
////            array_push($result, $item);
//        }
//        $respuesta = array("Localidades" => $result);
//        return $respuesta;
//    }
    public RetrievePais_OtraOpcion() {    	
    }

    @Override
    public void processContent(String data,String parentName) {
        String option="";
//        ((LinkedList<String>)desendencia).add(parentName);
        option=getOption(data);
        if(option.equalsIgnoreCase("Regiones")){
            processRegiones(data,parentName);            
        }else if(option.equalsIgnoreCase("Barrios")){
            processBarrios(data,parentName);
        }else if(option.equalsIgnoreCase("Partidos")){
            processPartidos(data,parentName);
        }else if(option.equalsIgnoreCase("Localidades")){
            processLocalidades(data,parentName);
        }else if(option.equalsIgnoreCase("")){
        }else if(option.equalsIgnoreCase("")){
        }else{
            
        }
        

    }

    private void getRegionesByPais(String paisId, String parentName) {
        super.retrivie("http://www.argenprop.com/Regiones/FindRegionesByPaisBusqueda?idPais=" + paisId,parentName, null, null,"utf-8");
    }

    public void retrieve() {
        String pais = "";
        String paisId = "";
        String paisDato = "<select id=sp.Pais name=sp.Pais>";
        paisDato += "<option selected=selected value=1>Argentina</option>";
//        paisDato += "<option value=3>Uruguay</option>";
//        paisDato += "<option value=4>Bolivia</option>";
//        paisDato += "<option value=5>Brasil</option>";
//        paisDato += "<option value=6>Chile</option>";
//        paisDato += "<option value=7>Paraguay</option>";
//        paisDato += "<option value=8>Otros países</option>";
        paisDato += "</select>";

        String regex = "value=([0123456789]{1,})>(.*?)</option>";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL | Pattern.UNICODE_CASE | Pattern.UNIX_LINES);
        Matcher matcher = pattern.matcher(paisDato);
        logger.info("DROP PROCEDURE crearPaises;");
        logger.info("CREATE PROCEDURE crearPaises()");
        logger.info("BEGIN");
        logger.info("DECLARE localidadId INT DEFAULT NULL;");
        while (matcher.find()) {
            paisId = matcher.group(1);
            pais = matcher.group(2);
            logger.info("INSERT INTO pais(name) values('"+pais+"');");
            getRegionesByPais(paisId,pais);
        }
        logger.info("END;");
    }

    private String getOption(String data) {
        String value="";
        String regex = "\\{\"(.*?)\":(.*)";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL | Pattern.UNICODE_CASE | Pattern.UNIX_LINES);
        Matcher matcher = pattern.matcher(data);
        if (matcher.find()) {
            value=matcher.group(1);
        }
        return value;
    }

    private void processRegiones(String data, String parentName) {
        String nombre = "";
        String id = "";
        String enabled = "";
        Pattern pattern = null;
        Matcher matcher = null;
        pattern = Pattern.compile("\"Nombre\":\"(.*?)\",\"Id\":(.*?),\"ShowMatchedRegions\":(.*?)}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        matcher = pattern.matcher(data);
        while (matcher.find()) {
            nombre = matcher.group(1);
            id = matcher.group(2);
            enabled = matcher.group(3);
            logger.info("INSERT INTO provincia(pais_id,name) values((select id from pais where name='"+parentName+"'),'" + nombre+"');");
            
            super.retrivie("http://www.argenprop.com/Regiones/FindChildrenByRegionBusqueda?idRegionBusqueda=" + id,nombre, null, null,"utf-8");
        }
    }

    private void processBarrios(String data, String parentName) {
        String nombre = "";
        String barrio = "";
        String id = "";
        String enabled = "";
        String abueloName = "";
        Boolean encontrado=Boolean.FALSE;
        
        Pattern pattern = null;
        Matcher matcher = null;
        Pattern patternSub = null;
        Matcher matcherSub = null;
        pattern = Pattern.compile("\\{\"Nombre\":\"(.*?)\",\"Id\":(.*?),(.*?)\"SubBarrios\":\\[(.*?)\\]", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        matcher = pattern.matcher(data);
//        abueloName = ((LinkedList<String>)desendencia).removeLast();
        abueloName = ((LinkedList<String>)desendencia).removeLast();
        while (matcher.find()) {
        	barrio = matcher.group(1);
            id = matcher.group(2);
            enabled = matcher.group(4);
//                        iteracion=2;
            logger.info("INSERT INTO partido(provincia_id,name) VALUES((SELECT id FROM provincia WHERE name='"+parentName+"'),'" + barrio+"');");
            logger.info("INSERT INTO localidad(partido_id,name) VALUES((SELECT id FROM partido WHERE name='"+barrio+"' AND provincia_id=(SELECT id FROM provincia WHERE name='"+parentName+"')),'" + barrio+"');");
            encontrado=Boolean.FALSE;
            patternSub = Pattern.compile("\\{\"Nombre\":\"(.*?)\",\"Id\":(.*?)\\}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
            matcherSub = patternSub.matcher(enabled);
            while (matcherSub.find()) {
                if (!encontrado) {
                    encontrado=Boolean.TRUE;
                    logger.info("SET localidadId=LAST_INSERT_ID();");
                }
                nombre = matcherSub.group(1);
                id = matcherSub.group(2);
                logger.info("INSERT INTO localidad(partido_id,parent_id,name,is_barrio) "
                        + "VALUES((SELECT id FROM partido WHERE name='"+barrio+"' AND provincia_id=(SELECT id FROM provincia WHERE name='"+parentName+"')),"
                        + "localidadId,'" + nombre+"',true);");
            }
        }
        
    }

    private void processPartidos(String data, String parentName) {
        String nombre = "";
        String id = "";
        Pattern pattern = null;
        Matcher matcher = null;
        pattern = Pattern.compile("\\{\"Nombre\":\"(.*?)\",\"Id\":([0123456789]{1,})(.*?)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        matcher = pattern.matcher(data);
        while (matcher.find()) {
            nombre=matcher.group(1);
            id=matcher.group(2);
            logger.info("INSERT INTO partido(provincia_id,name) VALUES((SELECT id FROM provincia where name='"+parentName+"'),'" + nombre+"');");
            retrivie("http://www.argenprop.com/Regiones/FindLocalidadesDto?idPartido=" + id,nombre, null, null,"utf-8");
        }
    }

    private void processLocalidades(String data, String parentName) {
        String nombre = "";
        String localidad = "";
        String id = "";
        String enabled = "";
        String abueloName = "";
        Boolean encontrado=Boolean.FALSE;
        
        Pattern pattern = null;
        Matcher matcher = null;
        Pattern patternSub = null;
        Matcher matcherSub = null;
        pattern = Pattern.compile("\\{\"Nombre\":\"(.*?)\",\"Id\":([0123456789]{1,}),(.*?)\\\"Barrios\\\":\\[(.*?)\\]", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        matcher = pattern.matcher(data);
        abueloName = ((LinkedList<String>)desendencia).removeLast();
        abueloName = ((LinkedList<String>)desendencia).removeLast();

        while (matcher.find()) {
        	localidad = matcher.group(1);
            id = matcher.group(2);
            enabled = matcher.group(4);
//                        iteracion=2;
            logger.info("INSERT INTO localidad(partido_id,name) VALUES((SELECT id FROM partido WHERE name='"+parentName+"' AND provincia_id=(SELECT id FROM provincia WHERE name='"+abueloName+"')),'" + localidad+"');");
            
            encontrado=Boolean.FALSE;
            patternSub = Pattern.compile("\\{\"Nombre\":\"(.*?)\",\"Id\":([0123456789]{1,})\\}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
            matcherSub = patternSub.matcher(enabled);
            while (matcherSub.find()) {
                if (!encontrado) {
                    encontrado=Boolean.TRUE;
                    logger.info("SET localidadId=LAST_INSERT_ID();");
                }
                nombre = matcherSub.group(1);
                id = matcherSub.group(2);
                logger.info("INSERT INTO localidad(partido_id,parent_id,name,is_barrio) "
                        + "VALUES((SELECT id FROM partido WHERE name='"+parentName+"' AND provincia_id=(SELECT id FROM provincia WHERE name='"+abueloName+"')),"
                        + "localidadId,'" + nombre+"',true);");
            }
        }        
        desendencia.add(abueloName);
    }
}
